home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Skunkware 5
/
Skunkware 5.iso
/
src
/
X11
/
wais
/
ir
/
list.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-05-09
|
4KB
|
219 lines
/* WIDE AREA INFORMATION SERVER SOFTWARE
No guarantees or restrictions. See the readme file for the full standard
disclaimer.
Brewster@think.com
*/
/* Change log:
* $Log: list.c,v $
* Revision 1.4 92/03/07 19:44:00 jonathan
* changed function argument to sort_list from long to int.
* mycroft@hal.gnu.ai.mit.edu.
*
* Revision 1.3 92/02/13 12:40:11 jonathan
* Corrected syntax for function as arguments.
*
* Revision 1.2 92/02/12 13:33:36 jonathan
* Added "$Log" so RCS will put the log message in the header
*
*/
/* List Utilities.
*
* -brewster
*/
#include "list.h"
/* a list is an end_of_list terminated array */
char empty_tmp = 'f';
void *end_of_list = (void*)&empty_tmp; /* this is special */
void* car(list)
void **list;
{
if(end_of_list == *list)
return(end_of_list);
else
return(*list);
}
/* returns the nth element (0 is the first element).
it returns NULL if it asks for an element off the end (?).
*/
void* nth(number, list)
long number;
void **list;
{
if(number < length(list))
return(list[number]);
else
return(NULL);
}
void
setf_nth(number, elem, list)
long number;
void* elem;
void**list;
/* set the nth element */
{
if(number < length(list))
list[number] = elem;
}
void* first(list)
void **list;
{
return(car(list));
}
void* second(list)
void **list;
{
return(car(cdr(list)));
}
void* last(list)
void **list;
{
long len = length(list);
if (len > 0)
return(nth(len - 1,list));
else
return(NULL);
}
void** cdr(list)
void **list;{
if(NULL == list)
return((void**)end_of_list);
else if(end_of_list == *list)
return((void**)end_of_list);
else
return(list+1);
}
void** nth_cdr(list, n)
void **list;
long n;{
void** l = list;
long i;
for (i = 0; i < n; i++)
l = cdr(l);
return(l);
}
void** rest(list)
void **list;
{
return(cdr(list));
}
void* cadr(list)
void **list;
{
if(NULL == list)
return(NULL);
else if(end_of_list == *list)
return(NULL);
else
return(*(list+1));
}
/* length of a list. returns -1 if error.*/
long length(list)
void** list;
{
long count = 0;
if(list == NULL)
return(0);
while(end_of_list != list[count])
count++;
return(count);
}
void mapcar(list, function)
void **list;
void (*function)();
{
if(!null(list)){
(*function)(car(list));
mapcar(cdr(list), function);
}
}
/* pushes the item on the end of the list. returns the list. */
void **collecting(list, item)
void **list;
void *item;
{
long len = length(list);
if(0 == len){
list = (void**)malloc(2 * sizeof(void*));
list[0] = item;
list[1] = end_of_list;
return(list);
}
else{
list = (void **)realloc((char *)list, (len + 2) * sizeof(void*));
list[len] = item;
list[len + 1] = end_of_list;
}
return(list);
}
void setf_car(list, item)
void** list;
void* item;
{
list[0] = item;
}
/* returns true if the list is NULL */
boolean null(list)
void **list;
{
if(list == NULL)
return(true);
if(list[0] == end_of_list)
return(true);
return(false);
}
boolean free_list(list)
void **list;
{
if(list != NULL)
s_free(list);
return(true);
}
void
sort_list(list, cmp)
void** list;
int (*cmp)();
{
qsort(list,length(list),sizeof(void*),cmp);
}
void**
remove_item_from_list(list, pos)
void** list;
long pos;
{
long count = pos;
if (list == NULL || list[0] == end_of_list)
return(NULL);
while (end_of_list != list[count])
{ list[count] = list[count + 1];
count++;
}
list = (void**)realloc((char*)list,count*sizeof(void*));
return(list);
}